package com.om.characterization;

public class RateCalculator {
	boolean isWinter() {
		return false;
	}

	int calculateSlidingScale(int kwh) {
		return kwh;
	}

	int calculateTerritory(int address) {
		return address;
	}

	double calculateRate(Customer c) {
		double rate = 0;
		switch (c.type) {
		case consumer:
			switch (c.rate) {
			case lifeline:
				if (c.kwh <= 100) {
					rate = c.kwh * .03;
					break;
				} else if (c.kwh <= 200) {
					rate = 3 + (c.kwh - 100) * .05;
					break;
				}
				// Customer does not qualify for lifline,
				// fall through to territorial case.
			case territorial:
				switch (calculateTerritory(c.address)) {
				case 1:
					// spec says territory 1 and 2 use same rate.
				case 2:
					rate = c.kwh * (isWinter() ? .07 : .06);
					break;
				case 3:
					rate = c.kwh * .065;
					break;
				}
				break;
			}
			break; // consumer
		case business:
		case industrial:
			for (Site s : c.sites)
				rate += calculateSlidingScale(s.kwh);
			if (c.type == CustomerType.industrial) {
				switch (c.industrialRate) {
				case interruptable:
					rate *= .8;
					break;
				case oneHourNotice:
					rate *= .9;
					break;
				default:
					rate *= .95;
					break;
				}
			}
			// industrial rate
			break; // business + industrial
		} // customer.type
		return rate;
	}

}
